package top.lishuoboy.springmvc.a11;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 十一、异常处理器
 *
 * @author lishuoboy
 */
@Slf4j
@Controller
@RequestMapping("/a11")
public class ExceptionResolverController {

    /**
     * http://localhost:8080/lishuoboy_springmvc_war_exploded/a11
     */
    @RequestMapping("")
    private String index() {
        return "a11/index";
    }

    /**
     * 1、基于配置的异常处理(本来在控制台输出的日志也不输出了)
     * SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口：HandlerExceptionResolver
     * HandlerExceptionResolver接口的实现类有：DefaultHandlerExceptionResolver 和 SimpleMappingExceptionResolver
     * SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver，使用方式：
     */
    @RequestMapping("/1")
    @ResponseBody
    private String excection1() {
        System.out.println(1 / 0);
        return "SUCCESS";
    }

    /**
     * 2、基于注解的异常处理
     * //@ControllerAdvice将当前类标识为异常处理的组件
     * //@ExceptionHandler用于设置所标识方法处理的异常 @ExceptionHandler(ArithmeticException.class)
     * //ex表示当前请求处理中出现的异常对象
     */
    @RequestMapping("/2")
    @ResponseBody
    private String excection2() {
        String str = null;
        System.out.println(str.length());
        return "SUCCESS";
    }

    /**
     * 3、默认情况下，web项目（包括原生web和springMVC）在运行时异常时，直接将打印在前端页面，后台没有打印输出到控制台（catalina.2021-10-15.log），只输出到了“localhost.2021-10-15.log”文件中，
     * 所以增加一个异常处理器，将所有Exception日志输出打印到控制台（catalina.2021-10-15.log）
     * http://localhost:8080/lishuoboy_springmvc_war_exploded/a11/3
     */
    @RequestMapping("/3")
    @ResponseBody
    private String excection3() {
        int[] a = new int[0];
        System.out.println(a[100]);
        return "SUCCESS";
    }
}